/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import connection.AbstractConnection;
import entidades.Artista;
import entidades.Categoria;
import entidades.Gravadora;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Ricardo
 */
public class ArtistaCategoriaGravadoraDAO extends AbstractDAO {

    private final String sqlFindCategoriaById = "select * from categoria where idcategoria=?";
    private final String sqlFindArtistaById = "select * from artista where id=?";
    private final String sqlFindGravadoraById = "select * from gravadora where idgravadora=?";
    private final String sqlInsert = "insert  into values (?,?)";
    private final String sqlGet = "select * from ";

    public ArtistaCategoriaGravadoraDAO(AbstractConnection conn) {
        super(conn);
    }

    public Categoria getCategoriaById(int id) throws SQLException {
        PreparedStatement st = conn.getConnection().prepareStatement(sqlFindCategoriaById);
        Categoria c = null;

        st.setInt(1, id);
        ResultSet rs = st.executeQuery();

        while (rs.next()) {
            c = new Categoria();
            c.setId(rs.getInt("idcategoria"));
            c.setCategoria(rs.getString("nome_categoria"));
        }

        conn.closeConnection();

        return c;
    }

    public Gravadora getGravadoraById(int id) throws SQLException {
        PreparedStatement st = conn.getConnection().prepareStatement(sqlFindGravadoraById);
        Gravadora g = null;

        st.setInt(1, id);
        ResultSet rs = st.executeQuery();

        while (rs.next()) {
            g = new Gravadora();
            g.setId(rs.getInt("idgravadora"));
            g.setNome(rs.getString("nome_gravadora"));
        }

        conn.closeConnection();

        return g;
    }

    public Artista getArtistaById(int id) throws SQLException {
        PreparedStatement st = conn.getConnection().prepareStatement(sqlFindArtistaById);
        Artista a = null;

        st.setInt(1, id);
        ResultSet rs = st.executeQuery();

        while (rs.next()) {
            a = new Artista();
            a.setId(rs.getInt("id"));
            a.setNome(rs.getString("nome_artista"));
        }

        conn.closeConnection();

        return a;
    }

    private String montaEntity(String table, String[] fields) {
        StringBuilder tableFields = new StringBuilder();
        int count = 0;

        tableFields.append(table);
        tableFields.append(" (");
        for (String f : fields) {
            if ((count++) > 0) {
                tableFields.append(",");
            }
            tableFields.append(f);
        }
        tableFields.append(")");
        return tableFields.toString();
    }

    private void inserir(String table, String[] fields, String vlr) throws SQLException {
        StringBuilder sb = new StringBuilder(sqlInsert);
        sb.insert(7, montaEntity(table, fields));

        PreparedStatement ps = conn.getConnection().prepareStatement(sb.toString());
        ps.setInt(1, getNextId(fields[0], vlr));
        ps.setString(2, vlr);
        ps.executeQuery();

        conn.closeConnection();
    }

    public void inserir(Categoria c) throws SQLException {
        inserir("categoria", new String[]{"id_categoria", "nome_categoria"}, c.getCategoria());
    }

    public void inserir(Artista a) throws SQLException {
        inserir("artista", new String[]{"id", "nome_artista"}, a.getNome());
    }

    public void inserir(Gravadora g) throws SQLException {
        inserir("gravadora", new String[]{"id_gravadora", "nome_gravadora"}, g.getNome());
    }
    
    private List<Entidade> getAll(String table) throws SQLException {
        StringBuilder sb = new StringBuilder(sqlGet);
        List<Entidade> result = new ArrayList<Entidade>();
        
        sb.append(table);
        
        PreparedStatement ps = conn.getConnection().prepareStatement(sb.toString());
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            result.add(new Entidade(rs.getInt(1),rs.getString(2)));
        }
        
        conn.closeConnection();
        
        return result;
    }
    
    public List<Categoria> getAllCategoria() throws SQLException {
        List<Categoria> result = new ArrayList<Categoria>();
        List<Entidade> entidades = getAll("categoria");
        for (Entidade e : entidades) {
            Categoria c = new Categoria();
            c.setId(e.id);
            c.setCategoria(e.nome);
            result.add(c);
        }
        return result;
    }
    
    public List<Artista> getAllArtista() throws SQLException {
        List<Artista> result = new ArrayList<Artista>();
        List<Entidade> entidades = getAll("artista");
        for (Entidade e : entidades) {
            Artista a = new Artista();
            a.setId(e.id);
            a.setNome(e.nome);
            result.add(a);
        }
        return result;
    }
    
    public List<Gravadora> getAllGravadora() throws SQLException {
        List<Gravadora> result = new ArrayList<Gravadora>();
        List<Entidade> entidades = getAll("gravadora");
        for (Entidade e : entidades) {
            Gravadora g = new Gravadora();
            g.setId(e.id);
            g.setNome(e.nome);
            result.add(g);
        }
        return result;
    }
    
    private class Entidade {
        public int id;
        public String nome;
        
        public Entidade(int id,String nome) {
            this.id = id;
            this.nome = nome;
        }
    }
}
